<?php
/** 
 * 垃圾回收机制
 * 触发垃圾回收机制
*/
class Foo
{
    public $var = '3.1415962654';

    public function __construct() 
    {
    	$var = rand(1, 10000);
    }
}

$baseMemory = memory_get_usage();

/**
 * 自己引用自己 无法
 * 在每次循环中，都会创建一个新的 Foo 对象$a，并将其 self 属性指向自己。
 * 在次赋值$a 变量还引用了前一个 $a 对象，前一个对象将无法被删除，从而导致内存占用不断增加。
 * 
 * 最终，内存占用会达到 PHP 进程的最大限制，自动执行垃圾回收,而不会导致崩溃
 * 可以看到每次循环1万次,触发了垃圾回收,使用的内存表变小了
 */

for ( $i = 0; $i <= 100000; $i++ )
{
    $a = new Foo;
    $a->self = $a;
    if ( $i % 500 === 0 )
    {
        //xdebug_debug_zval('a');
        echo sprintf( '%8d: ', $i ), memory_get_usage() - $baseMemory, "\n";

    }
}